#pragma once
#include "std.h"

#define DESTROY_OBJECT(p) delete(CVirtualDestruct *)(p)
#define DESTROY_OBJECT_AND_NULL(p) \
    do                             \
    {                              \
        if(p)                      \
        {                          \
            DESTROY_OBJECT(p);     \
            p = nullptr;           \
        }                          \
    } while(0)

class CVirtualDestruct
{
public:
    CVirtualDestruct() {};
    virtual ~CVirtualDestruct() {};

    virtual int ClassInfo(void *p = nullptr) { return 0; }; // 使用虚函数检查性能好于TypeID，但需要手动分配ID并重写子类的ClassInfo返回ID。
    virtual U64 TypeID() { return STD_TYPE_ID(this); };
};
